package com.sigmatrix.h5.service;

import java.util.List;
import java.util.Map;

import com.sigmatrix.h5.dto.ProductData;
import com.sigmatrix.h5.entity.Product;
import com.sigmatrix.h5.exception.ServiceException;
import com.sigmatrix.h5.request.Request;
import com.sigmatrix.h5.response.Response;
import com.sigmatrix.h5.web.vo.ProductVo;
import com.sigmatrix.sc.jdbc.common.service.Service;
/**
 * 
 *@ClassName: ProductService
 *@Description: 产品
 *@author MH
 *@date 2017年9月26日 下午5:55:45
 */
public interface ProductService extends Service<Product,Integer>{
	
	/**
	 * 
	 *@Title: findByBasicModuleId
	 *@Description:通过基础数据ID查询
	 *@return Product
	 *@author MH
	 *@date 2018年1月16日 下午5:18:01
	 *@param basicModuleId
	 *@return
	 */
	Product findByBasicModuleId(Integer basicModuleId);
	
	/**
	 *@Title: findById
	 *@Description: 根据主键查找产品
	 *@return ProductData
	 *@author youjun
	 *@date 2017-06-24 17:26:49
	 *@param id
	 *@param enterpriseCode
	 *@return
	 * @throws ServiceException 
	 */
	ProductData findById(final Integer id, final String enterpriseCode) throws ServiceException;

	/**
	 *@Title: findListByCondition
	 *@Description: 根据条件查询产品列表
	 *@return List<ProductData>
	 *@author youjun
	 *@date 2017-06-24 17:26:49
	 *@param productVo
	 *@return
	 *@throws ServiceException
	 */
	List<ProductData> findListByCondition(ProductVo productVo) throws ServiceException;

	/**
	 *@Title: getAllProductMap
	 *@Description: 获得所有产品的map
	 *@return Map<Integer,ProductData>
	 *@author youjun
	 *@date 2017年6月25日 下午3:12:33
	 *@return
	 *@throws ServiceException
	 */
	Map<Integer, ProductData> getAllProductMap(final String enterpriseCode) throws ServiceException;

	/**
	 *@Title: getAllProductList
	 *@Description: 获得所有产品的集合
	 *@return List<ProductData>
	 *@author youjun
	 *@date 2017年6月25日 下午3:12:42
	 *@return
	 *@throws ServiceException
	 */
	List<ProductData> getAllProductList(final String enterpriseCode) throws ServiceException;

	/**
	 *@Title: getProductFromMap
	 *@Description: 从map中获取产品,若无将从数据库中查询并放入map中
	 *@return ProductData
	 *@author youjun
	 *@date 2017年6月25日 下午3:25:14
	 *@param productMap
	 *@param productId
	 *@return
	 *@throws ServiceException
	 */
	ProductData getProductFromMap(Map<Integer, ProductData> productMap, Integer productId, String enterpriseCode)
			throws ServiceException;

	/**
	 *@Title: findPartColumnListByCondition
	 *@Description: 根据条件查询产品部分列的列表
	 *@return List<ProductData>
	 *@author youjun
	 *@date 2017年6月26日 下午2:40:56
	 *@param productVo
	 *@return
	 *@throws ServiceException
	 */
	List<ProductData> findPartColumnListByCondition(ProductVo productVo) throws ServiceException;

	/**
	 *@Title: syncProductList
	 *@Description: 同步产品列表
	 *@return Response
	 *@author youjun
	 *@date 2017年6月26日 下午7:16:47
	 *@param productVo
	 * @throws ServiceException 
	 */
	Response syncProductList(ProductVo productVo) throws ServiceException;

	/**
	 *@Title: getProductFromCache
	 *@Description: 从产品缓存中获取产品,若缓存为空则从数据库中获取
	 *@return ProductData
	 *@author youjun
	 *@date 2017年7月3日 下午9:34:14
	 *@param productId
	 *@param enterpriseCode
	 *@return
	 *@throws ServiceException
	 */
	ProductData getProductFromCache(Integer productId, String enterpriseCode) throws ServiceException;

	/**
	 *@Title: getCountHaveSpecifiedLevelCount
	 *@Description: 获得当前级别换算成指定级别的数量
	 *@return int
	 *@author youjun
	 *@date 2017年8月13日 下午3:42:12
	 *@param product
	 *@param currentLevel
	 *@param specifiedLevel
	 *@return
	 *@throws ServiceException
	 */
	int getCountHaveSpecifiedLevelCount(ProductData product, int currentLevel, int specifiedLevel)
			throws ServiceException;

	/**
	 *@Title: getCodeHaveSpecifiedLevelCount
	 *@Description: 获得当前码级别换算成指定
	 *@return int
	 *@author youjun
	 *@date 2017年8月14日 下午10:14:16
	 *@param product 产品
	 *@param codeLevel 码级别
	 *@param specifiedLevel 指定级别
	 *@return
	 *@throws ServiceException
	 */
	int getCodeHaveSpecifiedLevelCount(ProductData product, int codeLevel, int specifiedLevel)
			throws ServiceException;

	/**
	 *@Title: findById
	 *@Description: TODO()
	 *@return ProductData
	 *@author youjun
	 *@date 2017年8月27日 下午10:39:55
	 *@param id
	 *@param isSelectPack
	 *@param enterpriseCode
	 *@return
	 *@throws ServiceException
	 */
	ProductData findById(Integer id, boolean isSelectPack, String enterpriseCode) throws ServiceException;


	/**
	 *@Title: syncProductList
	 *@Description: 同步产品列表
	 *@return Response
	 *@author youjun
	 *@date 2017年6月26日 下午7:16:47
	 *@param request
	 * @throws ServiceException 
	 */
	Response syncProductList(Request request) throws ServiceException;

}
